// 文件名：flat_set_hotpath_ids.cpp
// 目的：在热路径上使用 std::flat_set 维护允许的 ID 集合，高效进行存在性判断与顺序输出。
// 性能要点：
//   - reserve(16)：预留容量以减少后续 insert 的重分配与移动，提升构建阶段性能；
//   - contains(id)：O(log N) 二分查找；
//   - 遍历时具有良好的缓存局部性（连续内存），吞吐优于基于树的 set；
//   - 插入批量数据可先收集到 vector，排序去重后通过构造或 merge 方式一次性导入以减少移动。
// 注意：
//   - flat_set 插入/删除为 O(N)；若运行期频繁更新，需评估成本或改用 std::unordered_set/std::set。
//   - #include <flat_set> 需实现支持（C++23 或供应商扩展）。
#include <flat_set>
#include <iostream>
#include <random>
#include <vector>

int main() {
    std::flat_set<int> allowedIds;
    allowedIds.reserve(16); // 热路径：避免后续增长重分配

    // 批量插入（有序存储、自动唯一）
    allowedIds.insert({101, 202, 303, 404, 505, 606});

    std::vector<int> testIds = {101, 222, 303, 999, 404, 606};

    // 热路径判定：二分 contains
    for (int id : testIds) {
        if (allowedIds.contains(id)) {
            std::cout << "ID " << id << " allowed\n";
        } else {
            std::cout << "ID " << id << " rejected\n";
        }
    }

    // 展示遍历的连续性
    std::cout << "All allowed IDs:\n";
    for (int id : allowedIds) {
        std::cout << "  " << id << '\n';
    }

    return 0;
}